/***************************************************************************
 创建者: 华磊
 开始时间: 2018.8.14
 copyright: (C) 华友高科
 修改说明: (每次有修改就添加一条，带有 修改人，修改时间，修改描述)
 example (1) hualei 2017.5.8 类的具体实现代码编写

 ***************************************************************************/
#include "md5check.h"
#include <iostream>
#include <fstream>
#include <qfile.h>
#include <qdebug.h>

MD5Check::MD5Check()
{
//    versionInfo.componentName="MD5Check";
//    versionInfo.componentVersion="V1.0";
//    versionInfo.publishDate="2018.10.27";

}

//int MD5Check::readVersion(std::vector <ComponentVersion> &componentVersionList)
//{
//    componentVersionList.push_back(versionInfo);
//    return 1;
//}

int MD5Check::isMd5CheckOk(QString originalFilePath,QString md5FilePath)
{
    string string1;
    string string2;
    if(-1==createMd5String(originalFilePath,string1))
    {
        return -1;
    }
    if(-1==readFile2String(md5FilePath,string2))
    {
        return -1;
    }

    if(string1==string2)
    {
        return 1;
    }
    else
    {
        return -1;
    }

}

int MD5Check::createMd5File(QString filePath)
{
    string stringIn;
    if(-1==createMd5String(filePath,stringIn))
    {
        qDebug()<<"MD5Check::createMd5File, Can't open the file!"<<endl;
        return -1;
    }
    writeString2File(stringIn,filePath+".md5");
    return 1;
}

int MD5Check::readFile2String(QString filePath, string &stringOut)
{

    QString str;
    QFile file(filePath);
    if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        qDebug()<<"MD5Check::readFile2String, Can't open the file!"<<endl;
        return -1;
    }
    while(!file.atEnd())
    {
        QByteArray line = file.readLine();
        str=line;

    }
    stringOut=str.toStdString();
    file.close();
    file.flush();//必须加，如果不加，可能关机的时候丢失文件内容。
    return 1;
}

int MD5Check::writeString2File(string stringIn,QString filePath)
{
    QString str;
    QFile file(filePath);
    if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
    {
        qDebug()<<"MD5Check::writeString2File, Can't open the file!"<<endl;

    }
    QTextStream txtOutput(&file);
    txtOutput << QString::fromStdString(stringIn);\
    file.close();
    file.flush();//必须加，如果不加，可能关机的时候丢失文件内容。

    return 1;
}

int MD5Check::createMd5String(QString filePath, string & stringOut)
{
    ifstream in(filePath.toStdString().c_str(),ios::binary);
    if(!in)
    {
        qDebug()<<"createMd5File error,!isFile";
        return -1;
    }
    MD5 md5(in);
    stringOut=md5.toString();
    return 1;
}

QString MD5Check::createMd5String(QString stringIn)
{
    MD5 md5(stringIn.toStdString());
    return QString::fromStdString(md5.toString());
}



//void MD5Check::initMd5()
//{
//    MD5 *pMd5 = new MD5();
//    setMd5((void*)pMd5);
//}

//void MD5Check::setMd5(void *pCMd5)
//{
//    m_pCMd5 = pCMd5;
//}

//string MD5Check::FileDigest(const string &file)
//{
//    ifstream in(file.c_str(),ios::binary);
//    if(!in)
//    {
//        //消息预留
//        //操作ｍｄ５流文件失败
//        return "";
//    }

//    MD5 md5;
//    std::streamsize length;
//    char buffer[1024];

//    while(!in.eof())
//    {
//        in.read(buffer,1024);
//        length = in.gcount();
//        if(length > 0)
//        {
//            md5.update(buffer,length);
//        }
//    }

//    in.close();

//    return md5.toString();
//}

//QString MD5Check::getFileName(const QString filePath)
//{
//    QString str;
//    QStringList list = filePath.split("/");

//    str = list[list.size() - 1];

//    return str;
//}

//QString MD5Check::produceFileMd5(QString fileName)
//{
//    string tmpMd5 = FileDigest(fileName.toStdString());
//    QString strMd5 = QString::fromStdString(tmpMd5);

//    return strMd5;
//}

//bool MD5Check::setMd5Check(QString fileName)
//{

//    QString strMd5 = produceFileMd5(fileName);

//    QString nodePro = getFileName(fileName);

//    openXml(MD5_FILE);
//    addPro(nodePro,strMd5);
//    closeWriteXml(MD5_FILE);

//}

//MD5Check* MD5Check::getInstance()
//{
//    if(NULL == m_pInstance)
//    {
//        m_pInstance = new MD5Check();
//    }

//    return m_pInstance;
//}

//bool MD5Check::deleteMd5(QString fileName,int robotId)
//{
//    QString nodePro = getFileName(fileName);
//    openXml(MD5_FILE);
//    deletePro(nodePro,robotId);
//    closeWriteXml(MD5_FILE);
//}

//bool MD5Check::compareMd5(QString fileName,int robotId)
//{
////    openXml(MD5_FILE);
////    QString nodePro = getFileName(fileName);
////    readXml(nodePro,readFileMd5);
////    closeXml();

//    qDebug() << "***fileName***"<<fileName<<endl;
//    QString nodePro = getFileName(fileName);
//    qDebug() << "***nodePro***"<<nodePro<<endl;

//    for(int i = 0; i < md5FileMap.count();i++)
//    {
//        int id = md5FileMap.keys().at(i);
//        if(id == robotId)
//        {
//            for(int j = 0; j < md5FileMap.value(robotId).count();j++)
//            {
//                QString nodeName = md5FileMap.value(robotId).keys().at(j);
//                if(nodePro == nodeName)
//                {
//                    readFileMd5 = md5FileMap.value(robotId).value(nodePro);
//                    break;
//                }
//            }
//            break;
//        }
//        else
//        {
//            if(i == md5FileMap.count() - 1)
//            {
//                //报错处理
//            }
//        }
//    }


//    qDebug() << "***readFileMd5***"<<readFileMd5<<endl;


//    produceMd5 = produceFileMd5(fileName);

//    qDebug() << "***produceMd5***"<<produceMd5<<endl;


//    if(!(QString::compare(readFileMd5,produceMd5)))
//    {
//        return true;
//    }
//    else
//    {
//        return false;
//    }
//}

//bool MD5Check::compareMd5(QString md5String,QString fileName)
//{
//     produceMd5 = produceFileMd5(fileName);

//     if(!(QString::compare(md5String,produceMd5)))
//     {
//         return true;
//     }
//     else
//     {
//         return false;
//     }
//}


//void MD5Check::getMd5FileList(QString md5File)
//{
////    qDebug() << __LINE__<<"******"<<__FUNCTION__<<endl;

//    if( !openXml(md5File) )
//        return;
//    getAllProList(md5FileMap);
//    closeXml();
////    for(int i = 0; i< md5FileMap.size();i++)
////    {
////        qDebug() <<"==i=="<<i << "*key***"<<md5FileMap.keys().at(i)<<"**value**"<<
////                  md5FileMap.values().at(i) ;
////    }
////    qDebug() << __LINE__<<"******"<<__FUNCTION__<<endl;
//}

//void MD5Check::saveFile(QString fileName, int robotId)
//{
//    QString nodePro = getFileName(fileName);

//    QString nodeValue = produceFileMd5(fileName);

//    QString nodeName;

//    bool existFlag = false;

//     openXml(MD5_FILE);

//    for(int i = 0; i < md5FileMap.size();i++)
//    {
//        int id = md5FileMap.keys().at(i);
//        if(robotId == id)
//        {
//            for(int j = 0; j < md5FileMap.value(robotId).count();j++)
//            {
//                nodeName = md5FileMap.value(robotId).keys().at(j);
//                if(nodePro == nodeName)
//                {
//                    existFlag = true;

//                    writeXml(robotId,nodePro,nodeValue);

//                    break;
//                }
//            }
//            break;
//        }
//    }

//    if(!existFlag)
//    {
//        addPro(robotId,nodePro,nodeValue);
//    }

//    closeWriteXml(MD5_FILE);
//}
